// 统一的 API 请求封装
// 参考 ruoyi-ui 的实现，适配 uni-app

import { API_BASE, API_PREFIX } from '@/config/config.js';

// 获取存储的 token
const getToken = () => {
  return uni.getStorageSync('token') || '';
};

// 设置 token
const setToken = (token) => {
  uni.setStorageSync('token', token);
};

// 移除 token
const removeToken = () => {
  uni.removeStorageSync('token');
};
// 请求拦截器
const requestInterceptor = (config) => {
  // 确保headers对象存在
  config.header = config.header || {};
  
  // 添加认证信息到请求头 - 保持与PC端完全一致
  const token = getToken();
  // 与PC端保持一致，不启用Cookie凭证携带
  config.withCredentials = false;
  if (token && config.header.isToken !== false) {
    config.header['Authorization'] = 'Bearer ' + token; // 完全按照PC端格式
  }

  // 确保URL正确 - 自动添加环境前缀
  if (!config.url.startsWith('http')) {
    // 由于后端已经通过Swagger pathMapping配置了/dev-api前缀，
    // 前端不应该重复添加前缀，直接添加API_BASE即可
    config.url = API_BASE + config.url;
  }
  
  // 设置默认请求头
  if (!config.header['Content-Type']) {
    config.header['Content-Type'] = 'application/json;charset=utf-8';
  }
  
  // 添加与PC端一致的请求头
  config.header['X-Requested-With'] = 'XMLHttpRequest';
  config.header['Accept'] = 'application/json, text/plain, */*';
  
  // GET请求参数处理
  if (config.method === 'GET' && config.data) {
    let url = config.url;
    const params = Object.keys(config.data)
      .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(config.data[key])}`)
      .join('&');
    if (params) {
      url += (url.includes('?') ? '&' : '?') + params;
    }
    config.url = url;
    config.data = undefined;
  }
  
  // 设置默认超时时间
  if (!config.timeout) {
    config.timeout = 10000;
  }
  
  return config;
};

// 响应拦截器
const responseInterceptor = (response) => {
  const { statusCode, data, header } = response;
  
  // 请求成功
  if (statusCode >= 200 && statusCode < 300) {
    return data;
  }

  // 记录错误详情
  
  
  // 处理错误状态码
  let message = '请求失败';
  if (statusCode === 401) {
    message = '登录已过期，请重新登录';
    // 清除 token 并跳转到登录页
    removeToken();
    uni.reLaunch({ url: '/pages/login' });
  } else if (statusCode === 403) {
    message = '没有权限访问';
  } else if (statusCode === 404) {
    message = '请求的资源不存在';
  } else if (statusCode === 500) {
    message = '服务器内部错误';
  }
  
  uni.showToast({
    title: message,
    icon: 'none',
    duration: 2000
  });
  
  return Promise.reject(new Error(message));
};

// 统一的请求方法
const request = (options) => {
  // 应用请求拦截器
  const config = requestInterceptor(options);
  
  return new Promise((resolve, reject) => {
    uni.request({
      ...config,
      success: (res) => {
        try {
          const result = responseInterceptor(res);
          resolve(result);
        } catch (error) {
          reject(error);
        }
      },
      fail: (error) => {
        let message = '网络请求失败';
        if (error.errMsg) {
          if (error.errMsg.includes('timeout')) {
            message = '请求超时，请检查网络';
          } else if (error.errMsg.includes('fail')) {
            message = '网络连接失败，请检查网络';
          }
        }
        
        uni.showToast({
          title: message,
          icon: 'none',
          duration: 2000
        });
        
        reject(error);
      }
    });
  });
};

// 导出工具函数
export {
  API_BASE,
  API_PREFIX,
  getToken,
  setToken,
  removeToken,
  request
};

export default request;
